#include"init_uninit.h"


/******************************************* 
 * 函数功能：初始化屏幕文件
 * 函数名：int lcd_init(void)
 * 形参：void
 * 返回值：int 0成功 -1失败
*********************************************/
int lcd_init(void)
{
    //打开frame buffer设备文件--屏幕文件
    lcd_fd = open(FB_FILE, O_RDWR);
    if(lcd_fd == -1)
    {
        perror("open error:");
        return -1;
    }

    //屏幕映射
    mem_p = (unsigned int *)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
    if(mem_p == MAP_FAILED)
    {
        perror("mmap");
        return -1;
    }

    return 0;
}

/******************************************* 
 * 函数功能：解除映射内存
 * 函数名：int lcd_uninit(void)
 * 形参：void
 * 返回值：int 0成功 -1失败
*********************************************/
int lcd_uninit(void)
{
   // 解除映射
    if (munmap(mem_p, 800*480*4) == -1) 
    {
        perror("munmap error:");
        return -1;
    }
    close(lcd_fd);
    return 0;
}

/******************************************* 
 * 函数功能：初始化Lcd
 * 函数名：struct LcdDevice *init_lcd(const char *device)
 * 形参：const char *device
 * 返回值：struct LcdDevice *   null失败 
*********************************************/
struct LcdDevice *init_lcd(const char *device)
{
	//申请空间
	struct LcdDevice* lcd = malloc(sizeof(struct LcdDevice));
	if(lcd == NULL)
	{
		return NULL;
	} 

	//1打开设备
	lcd->fd = open(device, O_RDWR);
	if(lcd->fd < 0)
	{
		perror("open lcd fail");
		free(lcd);
		return NULL;
	}
	
	//映射
	lcd->mp = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd->fd,0);

	return lcd;
}
